<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2017 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +---------------------------------------------------------------------
// | Author: Dean <zxxjjforever@163.com>
// +----------------------------------------------------------------------
namespace cmf\controller;

use app\admin\model\ThemeModel;
use think\Db;
use think\View;

class HomeBaseController extends BaseController {

	public function _initialize() {
		// 监听home_init
		hook('home_init');
		parent::_initialize();
		$siteInfo = cmf_get_site_info();
		$user = cmf_get_current_user();

		View::share('site_info', $siteInfo);
		View::share('user', $user);

		$request = \think\Request::instance();
		View::share('module', $request->module());
		View::share('controller', $request->controller());
		View::share('action', $request->action());
	}

	public function _initializeView() {
		$cmfThemePath = config('cmf_theme_path');
		$cmfDefaultTheme = cmf_get_current_theme();

		$themePath = "{$cmfThemePath}{$cmfDefaultTheme}";

		$root = cmf_get_root();
		//使cdn设置生效
		$cdnSettings = cmf_get_option('cdn_settings');
		if (empty($cdnSettings['cdn_static_root'])) {
			$viewReplaceStr = [
				'__ROOT__' => $root,
				'__TMPL__' => "{$root}/{$themePath}",
				'__STATIC__' => "{$root}/static",
				'__WEB_ROOT__' => $root,
			];
		} else {
			$cdnStaticRoot = rtrim($cdnSettings['cdn_static_root'], '/');
			$viewReplaceStr = [
				'__ROOT__' => $root,
				'__TMPL__' => "{$cdnStaticRoot}/{$themePath}",
				'__STATIC__' => "{$cdnStaticRoot}/static",
				'__WEB_ROOT__' => $cdnStaticRoot,
			];
		}

		$viewReplaceStr = array_merge(config('view_replace_str'), $viewReplaceStr);
		config('template.view_base', "{$themePath}/");
		config('view_replace_str', $viewReplaceStr);

		$themeErrorTmpl = "{$themePath}/error.html";
		if (file_exists_case($themeErrorTmpl)) {
			config('dispatch_error_tmpl', $themeErrorTmpl);
		}

		$themeSuccessTmpl = "{$themePath}/success.html";
		if (file_exists_case($themeSuccessTmpl)) {
			config('dispatch_success_tmpl', $themeSuccessTmpl);
		}

	}

	/**
	 * 加载模板输出
	 * @access protected
	 * @param string $template 模板文件名
	 * @param array $vars 模板输出变量
	 * @param array $replace 模板替换
	 * @param array $config 模板参数
	 * @return mixed
	 */
	protected function fetch($template = '', $vars = [], $replace = [], $config = []) {
		$template = $this->parseTemplate($template);
		$more = $this->getThemeFileMore($template);
		$this->assign('theme_vars', $more['vars']);
		$this->assign('theme_widgets', $more['widgets']);
		return parent::fetch($template, $vars, $replace, $config);
	}

	/**
	 * 自动定位模板文件
	 * @access private
	 * @param string $template 模板文件规则
	 * @return string
	 */
	private function parseTemplate($template) {
		// 分析模板文件规则
		$request = $this->request;
		// 获取视图根目录
		if (strpos($template, '@')) {
			// 跨模块调用
			list($module, $template) = explode('@', $template);
		}

		$viewBase = config('template.view_base');

		if ($viewBase) {
			// 基础视图目录
			$module = isset($module) ? $module : $request->module();
			$path = $viewBase . ($module ? $module . DS : '');
		} else {
			$path = isset($module) ? APP_PATH . $module . DS . 'view' . DS : config('template.view_path');
		}

		$depr = config('template.view_depr');
		if (0 !== strpos($template, '/')) {
			$template = str_replace(['/', ':'], $depr, $template);
			$controller = cmf_parse_name($request->controller());
			if ($controller) {
				if ('' == $template) {
					// 如果模板文件名为空 按照默认规则定位
					$template = str_replace('.', DS, $controller) . $depr . $request->action();
				} elseif (false === strpos($template, $depr)) {
					$template = str_replace('.', DS, $controller) . $depr . $template;
				}
			}
		} else {
			$template = str_replace(['/', ':'], $depr, substr($template, 1));
		}
		return $path . ltrim($template, '/') . '.' . ltrim(config('template.view_suffix'), '.');
	}

	/**
	 * 获取模板文件变量
	 * @param string $file
	 * @param string $theme
	 * @return array
	 */
	private function getThemeFileMore($file, $theme = "") {

		//TODO 增加缓存
		$theme = empty($theme) ? cmf_get_current_theme() : $theme;

		// 调试模式下自动更新模板
		if (APP_DEBUG) {
			$themeModel = new ThemeModel();
			$themeModel->updateTheme($theme);
		}

		$themePath = config('cmf_theme_path');
		$file = str_replace('\\', '/', $file);
		$file = str_replace('//', '/', $file);
		$file = str_replace(['.html', '.php', $themePath . $theme . "/"], '', $file);

		$files = Db::name('theme_file')->field('more')->where(['theme' => $theme])->where(function ($query) use ($file) {
			$query->where(['is_public' => 1])->whereOr(['file' => $file]);
		})->select();

		$vars = [];
		$widgets = [];
		foreach ($files as $file) {
			$oldMore = json_decode($file['more'], true);
			if (!empty($oldMore['vars'])) {
				foreach ($oldMore['vars'] as $varName => $var) {
					$vars[$varName] = $var['value'];
				}
			}

			if (!empty($oldMore['widgets'])) {
				foreach ($oldMore['widgets'] as $widgetName => $widget) {

					$widgetVars = [];
					if (!empty($widget['vars'])) {
						foreach ($widget['vars'] as $varName => $var) {
							$widgetVars[$varName] = $var['value'];
						}
					}

					$widget['vars'] = $widgetVars;
					$widgets[$widgetName] = $widget;
				}
			}
		}

		return ['vars' => $vars, 'widgets' => $widgets];
	}

	public function checkUserLogin() {
		$userId = cmf_get_current_user_id();
		if (empty($userId)) {
			$this->error("用户尚未登录", url("user/login/index"));
		}
	}

}